﻿using System;

namespace 面向对象的三大特性_封装继承多态
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
            什么是面向对象：把数字世界和真实世界一一对应（映射）。
            因为这三大特性，我们有机会.有可能整出面向对象，与真实世界一一对应。
            那三大特性：封装，继承，多态。
            封装：封存装载，把一个事物包装起来，在程序中，他是把一些行为进行整合，比如人可以吃，把吃的这个过程进行包装。这个就是封装
            继承：继承+传承，可以获得被继承人的部分东西，在程序中就是一个类继承另一个类，被继承的是父类，而继承的这个就是子类，继承在类后面加“：”冒号把要继承的那个类名写在冒号后面就可以。
            多态：多个形态，比如：父亲用筷子吃饭，儿子用叉子吃饭，同样都是吃饭，而父子间使用的餐具不同，这个就是多态，多种行为，多种动作，遇见一个事情不同人有不同的反应，所以有了多态这个特性
            virtual 虚方法的关键字   要求在继承中，子类重写的方法的方法名，返回值类型、参数列表相同。
            override重写的关键字，可以重写虚方法也可以重写父类的方法。
            里氏转换：1.子类对象可以调用父类中的成员，但是父类对象永远都只能调用自己的成员。
            2.子类可以赋值给父类 如果有一个地方需要一个父类作为参数，我们可以给一个子类代替，
            3.如果父类中装的是子类对象，那么可以将这个父类强转为子类对象
             */
            //子类可以赋值给父类
            Person s = new Student("耀耀");//里氏转换，父类为子类代言，而以下不能犯上
            //Console.WriteLine((Student)s);//将父类强转为子类对象输出的是子类对象的地址
            Person t = new Teacher("老王");


            Person[] peoples = { s, t};//声明了一个person类的数组存放他的子类方便遍历
            foreach (var item in peoples)
            {
                item.Eat("筷子", "鱼");//因为有继承，所以有相同的行为（接口），故而可以遍历。
            }
        }
    }
    //封装继承多态的演示：
    class Person
    {
        public string name;
        public virtual void Eat(string 方式,string food)//封装了一个吃的虚方法
        {
            Console.WriteLine($"人类需要吃饭，用{方式}吃{food}");
        }
        //父类无法调用子类
        //Console.WriteLine(a);
    }
    class Student : Person//继承：继承父类的方法和字段
    {
        int a = 10;//声明一个A让父类调用
        public Student(string name)//构造函数，方便我们赋值
        {
            this.name = name;
        }
        public override void Eat(string 方式, string food)//多态的体现，把行为重新定义，使用虚方法来实现多态
        {
            Console.WriteLine($"{name}走着吃东西={food}");
        }
    }
    class Teacher:Person
    {
        public Teacher(string name)//构造函数
        {
            this.name = name;
        }
        public override void Eat(string 方式, string food)//再次重新，声明3个类来实现3种不同的吃饭方式，虚方法和override。
        {
            Console.WriteLine($"{name}教职工餐厅{方式}={food}");
        }
    }
    class a
    {

    }
}
